package com.neouton.crm.approval.mapper;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.neouton.common.entity.ActivitiVO;
import com.neouton.crm.approval.entity.ApprovalLogVO;
import com.neouton.crm.approval.entity.ApprovalVO;
import com.neouton.crm.entity.SysUserEntity;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

@Mapper
public interface ApprovalMapper {

    /**
     * 分页查询待办列表
     *
     * @param page
     * @param entity
     * @return
     */
    IPage<ApprovalVO> queryApprovalByPage(@Param("page") IPage page, @Param("vo") ApprovalVO entity,
                                          @Param("activitis") List<ActivitiVO> activitiVOS);

    List<ApprovalVO> queryApprovalByPage(@Param("vo") ApprovalVO entity, @Param("activitis") List<ActivitiVO> activitiVOS);


    /**
     * 更具ID查询审批主表
     * @param approvalId
     * @return
     */
    ApprovalVO queryApprovalByAppID(Integer approvalId);

    /**
     * 查询审批日志
     * @param approvalId
     * @return
     */
    List<ApprovalLogVO> queryApprovalLogByAppID(Integer approvalId);

    /**
     * 获取当日最大版本号
     * @return
     */
    Integer queryMaxApprovalcodeByDate();

    /**
     * 发起审批，生成主表信息
     * @param approval
     * @return
     */
    Boolean insertApproval(@Param("approval")ApprovalVO approval);

    /**
     * 审批通过 多字段判断，可根据工作流ID，审批表主键进行操作
     * @param businessId 工作流ID
     * @param approvalId 与待办通知数据保持一致，统一为auth数据字典配置字段
     * @return
     */
    Boolean approved(@Param("businessId")Integer businessId,@Param("approvalId")Integer approvalId);

    /**
     * 审批驳回 多字段判断，可根据工作流ID，审批表主键进行操作
     * @param businessId 工作流ID
     * @param approvalId 与待办通知数据保持一致，统一为auth数据字典配置字段
     * @return
     */
    Boolean approvalRejection(@Param("businessId")Integer businessId,@Param("approvalId")Integer approvalId);

    /**
     * 审批撤回 多字段判断，可根据工作流ID，审批表主键进行操作
     * @param businessId 工作流ID
     * @param approvalId 与待办通知数据保持一致，统一为auth数据字典配置字段
     * @return
     */
    Boolean approvalWithdrawal(@Param("businessId")Integer businessId,@Param("approvalId")Integer approvalId);

    /**
     * 发起审批撤回，驳回后数据修改为原有状态
     * @param businessId 工作流ID
     * @param approvalId 与待办通知数据保持一致，统一为auth数据字典配置字段
     * @return
     */
    Boolean rejectionWithdrawal(@Param("businessId")Integer businessId,@Param("approvalId")Integer approvalId);

    /**
     * 发起审批撤回，修改原单据为撤回审批中
     * @param businessId 工作流ID
     * @param approvalId 与待办通知数据保持一致，统一为auth数据字典配置字段
     * @return
     */
    Boolean startApprovalWithdrawal(@Param("businessId")Integer businessId,@Param("approvalId")Integer approvalId);
    /**
     * 生成日志信息
     */
    Boolean insertApprovalLog(@Param("approvalLog")ApprovalLogVO approvalLog);

    /**
     * 分页查询查询审批记录，更具审批类型
     *
     * @param page
     * @param entity
     * @return
     */
    IPage<ApprovalVO> queryApprovalRecordByType(@Param("page") IPage page,
                                                @Param("vo") ApprovalVO entity,
                                                @Param("userList") List<SysUserEntity> userList);
    List<ApprovalVO> queryApprovalRecordByType(@Param("vo") ApprovalVO entity, @Param("userList") List<SysUserEntity> userList);


    /**
     * 已办审批查询
     * @param entity
     * @return
     */
    List<ApprovalVO> queryApprovalDoneRecordByType( @Param("vo") ApprovalVO entity);

    /**
     * 更新下一处理人
     * @param userId 下一处理人ID
     * @param approvalId 审批ID
     * @return
     */
    Boolean updateNextApproverByApprovalId(@Param("userId") Integer userId,@Param("approvalId") Integer approvalId);

    /**
     * 获取审批日志
     * @param approvalId
     * @return
     */
    List<Map<String,String>> queryApprovalLog(Integer approvalId);

    /**
     * 分页查询待办列表
     *
     * @param page
     * @param entity
     * @return
     */
    IPage<ApprovalVO> queryWithdrawalApprovalByPage(@Param("page") IPage page, @Param("vo") ApprovalVO entity,
                                          @Param("activitis") List<ActivitiVO> activitiVOS);

    /**
     * 分页查询待办列表
     *
     * @param page
     * @param entity
     * @return
     */
    List<ApprovalVO> queryWithdrawalApprovalDoneRecordByType( @Param("vo") ApprovalVO entity);

    /**
     * 分页查询待办列表
     *
     * @param page
     * @param entity
     * @return
     */
    IPage<ApprovalVO> queryWithdrawalApprovalRecordByType(@Param("page") IPage page,
                                                          @Param("vo") ApprovalVO entity,
                                                          @Param("userList") List<SysUserEntity> userList);

    List<String> queryApprovalStepsByApprovalCode(String approvalCode);
}
